package com.atguigu.juc;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * @author tongatong
 * @name BlockingQueueDemo
 * @description
 * 阻塞队列：
 *   阻塞队列是一个队列，先进先出。
 *   即，一个线程向阻塞队列的一头中添加元素，另一个线程在阻塞队列的另一头获取元素。
 *   当队列满的时候，添加线程将会堵塞。
 *   当队列为空的时候，获取线程将会堵塞。
 * 用处：
 *   未使用阻塞队列钱，需要我们手动调用线程的执行顺序。但，使用阻塞队列会自动唤醒线程，执行操作。
 *
 * 常用类：
 *   ArrayBlockingQueue,数组阻塞队列，有序，有界。
 *
 * 方法：
 *   （1）add() | element() | remove() | 会报异常
 *   （2）offer() | peek() | poll() | 特殊值，offer()满，报false，peek()和poll()返回null
 *   （3）put() | --- | take() | 阻塞
 *   （4）offer(...) | --- | poll(...) | 超时退出
 *
 * @date 2021/9/4
 * @time 9:13
 */
public class BlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        //长度为3的阻塞队列
        BlockingQueue<Integer> integers = new ArrayBlockingQueue<>(3);


        /*integers.add(1);
        integers.add(2);
        integers.add(3);
        //java.lang.IllegalStateException: Queue full
//        integers.add(4);

        System.out.println("integers.element() = " + integers.element());

        System.out.println("移除:"+integers.remove());
        System.out.println("移除:"+integers.remove());
        System.out.println("移除:"+integers.remove());*/
        /*System.out.println("integers.offer(1) = " + integers.offer(1));
        System.out.println("integers.offer(1) = " + integers.offer(2));
        System.out.println("integers.offer(1) = " + integers.offer(3));
        System.out.println("integers.offer(1) = " + integers.offer(4));

        System.out.println("integers.peek() = " + integers.peek());

        System.out.println("integers.poll() = " + integers.poll());
        System.out.println("integers.poll() = " + integers.poll());
        System.out.println("integers.poll() = " + integers.poll());*/
        /*integers.put(1);
        integers.put(2);
        integers.put(3);
        //当阻塞队列已满，任放入元素的时候，就会进入堵塞状态
//        integers.put(4);

        System.out.println("integers.take() = " + integers.take());
        System.out.println("integers.take() = " + integers.take());
        System.out.println("integers.take() = " + integers.take());*/
        integers.offer(1, 10, TimeUnit.MILLISECONDS);
        integers.offer(2, 10, TimeUnit.MILLISECONDS);
        integers.offer(3, 10, TimeUnit.MILLISECONDS);
        //当等待时间超过一定时间后，就会退出
        integers.offer(4, 10, TimeUnit.MILLISECONDS);

        System.out.println("integers.poll(10, TimeUnit.MILLISECONDS) = " + integers.poll(10, TimeUnit.MILLISECONDS));
        System.out.println("integers.poll(10, TimeUnit.MILLISECONDS) = " + integers.poll(10, TimeUnit.MILLISECONDS));
        System.out.println("integers.poll(10, TimeUnit.MILLISECONDS) = " + integers.poll(10, TimeUnit.MILLISECONDS));
        System.out.println("integers.poll(10, TimeUnit.MILLISECONDS) = " + integers.poll(10, TimeUnit.MILLISECONDS));

    }
}
